/*
    说明：本接口定义了首次从后端传到前端的数据格式
    像id一类的，非重要信息可以不展示
    像baseSize, bwDesignConsist等，手工配置类的，首次传来可以为null
*/

// 维度一：节点
interface NodeProps {
  id: string; // ID可显示可不显示，但是一定要传
  name: string;
  province: string;
  role: string | null;
  label: string | null;
}

// 维度二：局向
interface EdgeProps {
  id: string; // ID可显示可不显示，但是一定要传
  name: string;
}

// 维度三：链路
interface LinkProps {
  model: "400G" | "200G" | "100G" | "10G" | "1G";
  count: number;
}

// 这里只做粗略的类型约束，详细的类型约束应该依靠后端详细区分
interface ConvertRuleProps {
  from: "400G" | "200G" | "100G" | "10G" | "1G";
  fromNum: number;
  to: "400G" | "200G" | "100G" | "10G" | "1G";
  toNum: number;
}

// 单行逻辑（多行同理，不过需要几个配置项都齐备）：
// 1. 配置需求利用率==>得到需求带宽（带小数点数值=需求流量/需求利用率）
// 2. 对需求带宽应用基础颗粒度（含带宽转换规则）==>得到理论带宽（整数，最小单位是n*颗粒度）
// 3. 对理论带宽手动调整==>得到设计带宽
// 4. 把设计带宽用需求流量相除，得到设计利用率
// 综上，设计带宽和设计利用率，是本设计方案最终的结果
export interface EdgeSimulationProps {
  edge: EdgeProps; // 此Edge(边/局向)

  source: NodeProps; // A端节点
  target: NodeProps; // Z端节点

  traffDemand: number; // 需求流量
  bwNow: number; // 现状带宽
  bwNowContain: LinkProps[]; // 现状带宽构成

  utilDemand: number | null; // 需求利用率
  utilDesign: number | null; // 设计利用率

  baseSize: string | null; // 基础颗粒度
  convertRule: ConvertRuleProps[]; // 转换规则

  bwDemand: number | null; // 需求带宽
  bwCalcul: number | null; // 理论带宽（计算得出）
  bwDesign: number | null; // 设计带宽（人工修改）

  bwDemandCosist: LinkProps[] | null; //需求带宽构成
  bwDesignConsist: LinkProps[] | null; // 设计带宽构成

  isRecordSelectable: boolean;

  // 这里确保对象可以接受任何其他属性
  // mantine-datatable组件的records属性需要key值
  [key: string]: unknown; // 添加索引签名
}
